package com.microservice.common.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.*;

/**
 * 微信Token工具类 - 直接从Redis获取Token（低耦合方案）
 * 
 * 设计思路：
 * - 直接从 Redis 读取 Token（wechat-service 已缓存）
 * - 无需 HTTP 调用，性能更高，耦合度更低
 * - 如果 Token 不存在，说明 wechat-service 未初始化，提示用户
 * 
 * 使用方式：
 * 1. 确保服务依赖了 common 模块
 * 2. 确保 Redis 配置正确
 * 3. 确保 wechat-service 已启动并初始化了 Token
 * 4. 注入并使用 WechatTokenUtil
 */
@Component
public class WechatTokenUtil {
    
    @Autowired
    private RedisUtil redisUtil;
    
    private static final String TOKEN_KEY_PREFIX = "wechat:token:";
    private static final String COVER_ID = "wechat:cover:";

    /**
     * 获取微信 Access Token
     * 直接从 Redis 缓存获取（wechat-service 已缓存）
     * 
     * @param appId 微信 AppID
     * @return Access Token
     * @throws RuntimeException 如果Token不存在
     */
    public String getAccessToken(String appId) {
        String tokenKey = TOKEN_KEY_PREFIX + appId;
        Object cachedToken = redisUtil.get(tokenKey);
        
        if (cachedToken != null) {
            return cachedToken.toString();
        }
        
        throw new RuntimeException(String.format(
            "Token不存在: appId=%s。请确保：1) wechat-service已启动 2) 该账号已配置并启用 3) 首次获取需等待初始化",
            appId
        ));
    }

    public String getCoverId(String appId) {
        String coverKey = COVER_ID + appId;
        Object cachedCover = redisUtil.get(coverKey);

        if (cachedCover != null) {
            return cachedCover.toString();
        }

        throw new RuntimeException(String.format(
                "CoverId不存在: appId=%s",
                appId
        ));
    }
    
    /**
     * 检查Token是否存在
     * 
     * @param appId 微信 AppID
     * @return true-存在, false-不存在
     */
    public boolean hasToken(String appId) {
        String tokenKey = TOKEN_KEY_PREFIX + appId;
        return redisUtil.hasKey(tokenKey);
    }
    
    /**
     * 获取Token剩余有效时间（秒）
     * 
     * @param appId 微信 AppID
     * @return 剩余秒数，-1表示永久，-2表示不存在
     */
    public long getTokenTTL(String appId) {
        String tokenKey = TOKEN_KEY_PREFIX + appId;
        return redisUtil.getExpire(tokenKey);
    }
    
    /**
     * 随机获取一个账号的Token（从Redis中所有Token随机选择）
     * 
     * @return Map 包含 appId 和 token
     * @throws RuntimeException 如果没有可用的Token
     */
    public Map<String, String> getRandomAccessToken() {
        // 1. 从Redis获取所有Token的key
        Set<String> tokenKeys = redisUtil.keys(TOKEN_KEY_PREFIX + "*");
        
        if (tokenKeys == null || tokenKeys.isEmpty()) {
            throw new RuntimeException("没有可用的Token。请确保wechat-service已启动并初始化了Token");
        }
        
        // 2. 随机选择一个key
        List<String> keyList = new ArrayList<>(tokenKeys);
        Random random = new Random();
        String selectedKey = keyList.get(random.nextInt(keyList.size()));
        
        // 3. 提取appId
        String appId = selectedKey.replace(TOKEN_KEY_PREFIX, "");
        
        // 4. 获取Token
        Object token = redisUtil.get(selectedKey);
        
        // 5. 返回结果
        Map<String, String> result = new HashMap<>();
        result.put("appId", appId);
        result.put("token", token != null ? token.toString() : "");
        
        return result;
    }
}
